/**
 * MCP工具配置
 * 统一管理所有MCP工具的定义
 *
 * 重要：从 mcp-docs 目录的 JSON 文档动态加载工具定义，作为单一真相源（SSOT）。
 */

const fs = require('fs');
const path = require('path');

/**
 * 将JSON文档格式的参数转换为标准schema格式（支持必填字段）
 * @param {Array} params - JSON文档中的参数数组，元素包含 name、type、description、required
 * @returns {Object} 标准schema格式的参数定义
 */
function buildParametersSchema(params) {
  if (!params || params.length === 0) {
    return {
      type: 'object',
      properties: {},
      required: []
    };
  }

  const properties = {};
  const required = [];

  params.forEach(param => {
    properties[param.name] = {
      type: param.type,
      description: param.description
    };
    // 以 JSON 中的 required 字段为准
    if (param.required) {
      required.push(param.name);
    }
  });

  return {
    type: 'object',
    properties,
    required
  };
}

// 新增：从文档目录解析工具定义并构建配置
function normalizeToolDefinition(serverName, def) {
  const name = def.tool_name || def.name;
  return {
    name,
    description: def.description || '',
    mcpServer: serverName,
    parameters: buildParametersSchema(Array.isArray(def.parameters) ? def.parameters : [])
  };
}

function loadToolsFromDocs(docsDir) {
  const config = {};
  if (!docsDir || !fs.existsSync(docsDir) || !fs.statSync(docsDir).isDirectory()) {
    return config;
  }
  const files = fs.readdirSync(docsDir).filter(f => f.toLowerCase().endsWith('.json'));
  files.forEach(file => {
    const serverName = path.basename(file, '.json');
    try {
      const raw = fs.readFileSync(path.join(docsDir, file), 'utf8');
      const defs = JSON.parse(raw);
      if (Array.isArray(defs)) {
        config[serverName] = defs.map(def => normalizeToolDefinition(serverName, def));
      }
    } catch (e) {
      console.warn(`[MCP] 解析工具文档失败: ${file} -> ${e.message}`);
    }
  });
  return config;
}

function resolveDocsDir() {
  const candidates = [];
  // 环境变量优先（允许自定义路径）
  if (process.env.MCP_DOCS_DIR) {
    candidates.push(path.resolve(process.cwd(), process.env.MCP_DOCS_DIR));
  }

  // 基于源码文件位置的候选（默认：server/src/mcp-docs）
  candidates.push(path.resolve(__dirname, '../mcp-docs'));

  // 基于当前工作目录的候选（常见从工程根目录启动的情况）
  candidates.push(path.resolve(process.cwd(), 'server', 'src', 'mcp-docs'));

  for (const dir of candidates) {
    try {
      if (dir && fs.existsSync(dir) && fs.statSync(dir).isDirectory()) return dir;
    } catch (_) { /* ignore */ }
  }
  return null;
}

// 新增：尝试加载动态配置（优先使用文档目录）
const LOADED_TOOLS_CONFIG = (() => {
  try {
    const dir = resolveDocsDir();
    if (!dir) return {};
    return loadToolsFromDocs(dir);
  } catch (e) {
    console.warn('[MCP] 从文档目录加载工具配置失败:', e.message);
    return {};
  }
})();

// 所有MCP工具配置
const MCP_TOOLS_CONFIG = {};


/**
 * 获取所有工具配置
 * @returns {Array} 所有工具的配置数组
 */
function getActiveConfig() {
  return Object.keys(LOADED_TOOLS_CONFIG).length ? LOADED_TOOLS_CONFIG : MCP_TOOLS_CONFIG;
}

function getAllTools() {
  const allTools = [];
  Object.values(getActiveConfig()).forEach(serverTools => {
    allTools.push(...serverTools);
  });
  return allTools;
}

/**
 * 根据服务器名称获取工具配置
 * @param {string} serverName - MCP服务器名称
 * @returns {Array} 该服务器的工具配置数组
 */
function getToolsByServer(serverName) {
  const cfg = getActiveConfig();
  return cfg[serverName] || [];
}

module.exports = {
  MCP_TOOLS_CONFIG,
  getAllTools,
  getToolsByServer
};